#include "main.h"
#include "cmsis_os.h"
#include "messager.h"
#include "display_drv.h"
#include "ams.h"

// ##
#define LOG_TAG     "display"
#include "log.h"

// ##
static uint32_t list_mail[] =
{
    MSG_BTN_EVENT,
    MSG_RTC_ALARM,
};

#define MAIL_LIST_DEPTH (sizeof(list_mail) / sizeof(uint32_t))

// ##
static mMessager_t mail_box;

// ##
static uint32_t stack_last = 0;
static uint32_t stack_cur = 0;

// ##
osThreadId thread_display_id = NULL;

// ##
extern const ams_activity_t ams_app_capacity;
extern const ams_activity_t ams_app_dial;
extern const ams_activity_t ams_app_distance;
extern const ams_activity_t ams_app_heartrate;
extern const ams_activity_t ams_app_applist;
extern const ams_activity_t ams_app_steps;
extern const ams_activity_t ams_app_system;
extern const ams_activity_t ams_app_track;
extern const ams_activity_t ams_app_weather;
extern const ams_activity_t ams_app_pay;

// ##
void thread_display(const void *argument)
{
    msg_t msg;
    uint8_t content[256];
    uint32_t len = 0;
    ams_event_t ams_event;

    // ##
    lv_init();

    // ##
    display_drv_init();

    // ##
    mail_box = messager_create(MAIL_LIST_DEPTH);
    messager_register(mail_box, &list_mail[0], MAIL_LIST_DEPTH);

    // ##
    ams_init(mail_box);

    // ##
    ams_activity_register(&ams_app_dial);
    ams_activity_register(&ams_app_applist);
    ams_activity_register(&ams_app_pay);
    ams_activity_register(&ams_app_heartrate);
    ams_activity_register(&ams_app_track);
    ams_activity_register(&ams_app_weather);
    ams_activity_register(&ams_app_system);

    // ##
	ams_switch_by_name("dial", DIR_SLIDE_TO_NONE);

    log_info("%s starts to run\r\n", __func__);

    for (;;)
    {
        if (messager_recv(mail_box, &msg, content, &len, sizeof(content)) != RESULT_ERR)
        {
            ams_event.msg_id = msg;
            ams_event.content = content;
            ams_event.size = len;
            ams_event_handle(&ams_event);

            // ##
            stack_cur =  uxTaskGetStackHighWaterMark(osThreadGetId());

            if (stack_cur != stack_last)
            {
                stack_last = stack_cur;

                log_info("[%s] %ld bytes left in stack %ld bytes\r\n", osThreadGetName(osThreadGetId()), stack_cur *sizeof(StackType_t), THREAD_ROUTER_STACK_DEPTH *sizeof(StackType_t));
            }
        }
        else
        {
            log_error("failed to receive from mail_box.\r\n");
        }
    }
}

// void demo_track(lv_obj_t *lv_screen)
// {
//     display_area_t display_info =
//     {
//         .x = 40,
//         .y = 40,
//         .w = LV_HOR_RES_MAX - 40 *2,
//         .h = LV_HOR_RES_MAX - 40 *2,
//     };

//     track_payload_t *track = sport_track_extract_from_gpx(NULL, &display_info, "/home/billy/study/freeWear/middleware/analyze-gpx/src/gpx/example/10.gpx");

//     lv_point_t *array = gpx_malloc(sizeof(lv_point_t) *track->cnt);

//     for(uint32_t i = 0; i < track->cnt; i++)
//     {
//         array[i].x = track->array[i].x;
//         array[i].y = track->array[i].y;
//     }

//     static lv_style_t style;
//     lv_style_init(&style);

//     lv_style_set_line_color(&style, LV_STATE_DEFAULT, LV_COLOR_GREEN);
//     lv_style_set_line_width(&style, LV_STATE_DEFAULT, 2);
//     lv_style_set_line_rounded(&style, LV_STATE_DEFAULT, true);

//     /*Create an object with the new style*/
//     lv_obj_t *lv_line = lv_line_create(lv_screen, NULL);
//     lv_obj_set_size(lv_line, LV_HOR_RES_MAX, LV_HOR_RES_MAX);
//     lv_obj_add_style(lv_line, LV_LINE_PART_MAIN, &style);

//     lv_line_set_points(lv_line, array, track->cnt);

//     lv_obj_align(lv_line, NULL, LV_ALIGN_CENTER, 0, 0);

//     gpx_free(track);
// }

// void demo_watch(lv_obj_t *lv_screen)
// {
//     img_dial_black_bg = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_black_bg, &dial0_black_bg);
//     lv_obj_set_pos(img_dial_black_bg,
//                     (LV_HOR_RES_MAX - lv_obj_get_width(img_dial_black_bg)) / 2,
//                     (LV_VER_RES_MAX - lv_obj_get_height(img_dial_black_bg)) / 2);

//     img_dial_bg = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_bg, &dial0_bg);
//     lv_obj_set_pos(img_dial_bg,
//                     (LV_HOR_RES_MAX - lv_obj_get_width(img_dial_bg)) / 2,
//                     (LV_VER_RES_MAX - lv_obj_get_height(img_dial_bg)) / 2);

//     img_dial_needle_center = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_needle_center, &dial0_needle_center);
//     lv_obj_set_pos(img_dial_needle_center,
//                     (LV_HOR_RES_MAX - lv_obj_get_width(img_dial_needle_center)) / 2,
//                     (LV_VER_RES_MAX - lv_obj_get_height(img_dial_needle_center)) / 2);

//     img_dial_hours = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_hours, &dial0_hours);
//     lv_obj_set_pos(img_dial_hours, (LV_HOR_RES_MAX / 2) - 12, (LV_VER_RES_MAX / 2) - 106);
//     lv_img_set_pivot(img_dial_hours, 12, 106);

//     img_dial_minutes = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_minutes, &dial0_minutes);
//     lv_obj_set_pos(img_dial_minutes, (LV_HOR_RES_MAX / 2) - 12, (LV_VER_RES_MAX / 2) - 134);
//     lv_img_set_pivot(img_dial_minutes, 12, 134);

//     img_dial_seconds = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_seconds, &dial0_seconds);
//     lv_obj_set_pos(img_dial_seconds, (LV_HOR_RES_MAX / 2) - 2, (LV_VER_RES_MAX / 2) - 172);
//     lv_img_set_pivot(img_dial_seconds, 2, 172);

//     img_dial_hum_center = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_hum_center, &dial0_hum_press_center);
//     lv_obj_set_pos(img_dial_hum_center, 92, 184);

//     img_dial_press_center = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_press_center, &dial0_hum_press_center);
//     lv_obj_set_pos(img_dial_press_center, 276, 184);

//     img_dial_hum_needle = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_hum_needle, &dial0_hum_press_needle);
//     lv_obj_set_pos(img_dial_hum_needle, (LV_HOR_RES_MAX *3 / 4) - 8, (LV_VER_RES_MAX / 2) - 38);
//     lv_img_set_pivot(img_dial_hum_needle, 3, 38);

//     img_dial_press_needle = lv_img_create(lv_screen, NULL);
//     lv_img_set_src(img_dial_press_needle, &dial0_hum_press_needle);
//     lv_obj_set_pos(img_dial_press_needle, (LV_HOR_RES_MAX / 4) + 3, (LV_VER_RES_MAX / 2) - 38);
//     lv_img_set_pivot(img_dial_press_needle, 3, 38);
// }


// const char *app_name[] =
// {
//     "capacity",
//     "weather",
//     "distance",
//     "location",
//     "heart rate",
//     "system",
//     "sports"
// };

// const lv_img_dsc_t *app_icon[] =
// {
//     &icon_capacity,
//     &icon_cloudy,
//     &icon_distance,
//     &icon_gps,
//     &icon_heart,
//     &icon_info,
//     &icon_running,
// };

// typedef void (*app_event_cb_t)(const char *name, lv_event_t event);

// typedef struct _list_item_t
// {
//     const lv_img_dsc_t *icon;
//     char *name;
//     app_event_cb_t cb;
// }list_item_t;

// const list_item_t list_item[] =
// {
//     {&icon_capacity,
//         "capacity",
//             app_capacity_event_cb},
//     {&icon_cloudy,
//         "weather",
//             app_weather_event_cb},
//     {&icon_distance,
//         "distance",
//             app_distance_event_cb},
//     {&icon_gps,
//         "location",
//             app_location_event_cb},
//     {&icon_heart,
//         "heart rate",
//             app_hr_event_cb},
//     {&icon_info,
//         "system",
//             app_system_event_cb},
//     {&icon_running,
//         "sports",
//             app_sport_event_cb},
// };

// uint32_t list_get_size(void)
// {
//     return sizeof(list_item) / sizeof(list_item[0]);
// }

// static void list_event_handler(lv_obj_t* obj, lv_event_t event)
// {
//     if (event == LV_EVENT_CLICKED)
//     {
//         log_info("Clicked: %s\n", lv_list_get_btn_text(obj));

//         for(uint32_t i = 0; i < list_get_size(); i++)
//         {
//             const list_item_t *list = &list_item[i];
//             if(!strcmp(lv_list_get_btn_text(obj), list->name))
//             {
//                 list->cb(list->name, event);
//             }
//         }
//     }
// }

// void demo_list(lv_obj_t *lv_screen)
// {
//     const uint32_t list_size = list_get_size();
//     lv_obj_t *app_list = lv_list_create(lv_screen, NULL);
//     lv_obj_set_size(app_list, LV_HOR_RES, LV_HOR_RES);
//     lv_obj_align(app_list, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);

//     log_info("list_size : %d\r\n", list_size);

//     uint32_t i;
//     for(i = 0; i < list_size; i++)
//     {
//         const list_item_t *list = &list_item[i];
//         lv_obj_t *btn = lv_list_add_btn(app_list, list->icon, list->name);
//         lv_obj_set_event_cb(btn, list_event_handler);
//     }
// }
